package org.lt.cj.core;

import java.util.List;
import org.lt.cj.model.dao.ICollectDao;
import org.lt.cj.model.impl.CollectImpl;

public class LinkDB {

    //已访问的 url 集合
//    private Set<String> visitedUrl = new HashSet<String>();
    //待访问的 url 集合
//    private Queue<String> unVisitedUrl = new Queue<String>();
    private ICollectDao visitedUrlDao = new CollectImpl();
    //待访问的种子集合
    private Queue<Seed> unVisitedSeeds = new Queue<Seed>();

    public LinkDB(List urls) {                                             //从链接数组进行初始化
        initDBWithSeedList(urls);
    }

    private void initDBWithSeedList(List<Seed> urls) {

        //初始化未访问链接的链接数组
        for (int i = 0; i < urls.size(); i++) {
            addUnvisitedSeedUrl(urls.get(i));
        }
    }

    private void initDBWithList(List<Seed> urls) {

        //初始化未访问链接的链接数组
        for (int i = 0; i < urls.size(); i++) {
            addUnvisitedSeed(urls.get(i));
        }
    }

    private void initLinkDB(List<Seed> urls) {

        //初始化未访问链接的链接数组
        for (int i = 0; i < urls.size(); i++) {
            addUnvisitedSeed(urls.get(i));
        }
    }

    public Queue<Seed> getUnVisitedUrl() {
        return unVisitedSeeds;
    }

    public int getQueueUnvisitedUrlCount() {
        return unVisitedSeeds.getCount();
    }

    //添加已访问过的种子
    public void addVisitedSeed(String taskname, Seed seed) {
        String url = seed.getUrl();
        visitedUrlDao.insertUrl(taskname, url);
    }

    //添加已访问的URL链接
    public void addVisitedUrl(String taskname, String url) {
        visitedUrlDao.insertUrl(taskname, url);
    }

    /* Seed类型种子的出列 */
    public Seed unvisitedSeedDeQueue() {

        Seed seed = unVisitedSeeds.deQueue();
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);  //如果存在的话就返回该记录的ID，不存在的话就返回-1
        if (flag != -1) {                         //如果url存在,将url设置为空
            url = "";
        }
        return seed;
    }

    /* 字符串类型URL的出列 */
    public String unVisitedUrlDeQueue() {

        Seed seed = unVisitedSeeds.deQueue();
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);  //如果存在的话就返回该记录的ID，不存在的话就返回-1
        if (flag != -1) {                         //如果url存在,将url设置为空
            url = "";
        }
        return url;
    }

    public Seed unVisitedSeedDeQueue() {
        Seed seed = unVisitedSeeds.deQueue();
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);  //如果存在的话就返回该记录的ID，不存在的话就返回-1
        if (flag != -1) {                         //如果url存在,将url设置为空
            url = "";
        }
        return seed;
    }

    // 保证每个 Seed 只被访问一次
    public void addUnvisitedSeed(Seed seed) {
        boolean runFlag = false;
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);
        if (flag != -1) {
            runFlag = true;
        }
        if (url != null && !url.trim().equals("") && !unVisitedSeeds.contians(seed) && !runFlag) {
            unVisitedSeeds.enQueue(seed);
        }
    }

    //添加种子
    public void addUnvisitedSeedUrl(Seed seed) {

        boolean runFlag = false;
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);
        if (flag != -1) {
            runFlag = true;
        }
        if (url != null && !url.trim().equals("") && !unVisitedSeeds.contians(seed) && !runFlag) {
            unVisitedSeeds.enQueue(seed);
        }
    }

    public void saveUnvisitedUrl(String taskname, Seed seed) {
        boolean existFlag = false;
        String url = seed.getUrl();
        long flag = visitedUrlDao.existUrl(url);
        if (flag != -1) {
            existFlag = true;
        }
        if (url != null && !url.trim().equals("") && !unVisitedSeeds.contians(seed) && !existFlag && !visitedUrlDao.contiansUnvisitedUrl(url)) {
//            visitedUrlDao.insertUnvisitUrl(taskname, url);
            visitedUrlDao.insertUnvisitSeed(taskname, seed);
        }
    }

    public boolean unVisitedUrlsEmpty() {
        return unVisitedSeeds.isQueueEmpty();
    }
}
